
package com.hd.sup.modules.alarm.controller;


import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hd.common.constant.BizConstant;
import com.hd.common.page.BaseController;
import com.hd.common.reqres.request.RequestData;
import com.hd.common.reqres.response.Result;
import com.hd.common.utils.DateUtil;
import com.hd.sup.config.rabbitmq.producer.RabbitProducer;
import com.hd.sup.modules.alarm.model.AlarmReport;
import com.hd.sup.modules.alarm.service.IAlarmReportService;
import com.hd.sup.modules.alarm.wrapper.AlarmReportWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * @author chentl
 * @version V1.0
 * @Project 交通运输第三方监测平台
 * @Title AlarmRuleController.java
 * @Description 报警管理-分析报告
 * @Package com.hd.sup.modules.alarm.controller
 * @date 2021/1/7 6:47 下午
 * @Copyright: 深圳市宏电技术股份有限公司 All rights reserved.
 */
@Slf4j
@RestController
@RequestMapping("/alarmReport")
public class AlarmReportController extends BaseController {

    @Resource
    private IAlarmReportService alarmReportService;

    @Resource
    private RabbitProducer rabbitProducer;

    /**
     * @return com.hd.common.reqres.response.Result<?>
     * @author chentl
     * @description 生成分析报告数据
     * @date 2021/3/2 9:55 上午
     * @params [requestData]
     */
//    @PostMapping("/data")
    public Result<?> dataOld(@RequestBody RequestData requestData) {

        String dateStr = requestData.getString("date");
        String regionCode = requestData.getString("regionCode");
        String enterpriseNo = requestData.getString("enterpriseNo");
        String timeFlag = requestData.getString("timeFlag");

        if (StringUtils.isAnyEmpty(dateStr)) return Result.error("请传入时间字段 dateStr");
        if (StringUtils.isAllEmpty(regionCode, enterpriseNo))
            return Result.error("参数中 regionCode 和 enterpriseNo 不允许同时为空");
        if (StringUtils.isBlank(timeFlag)) return Result.error("参数中 timeFlag 为空");

        if (BizConstant.Common.DAY.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_DAY.key()))
            return Result.error("日期格式不合法，请传入 yyyy-MM-dd 格式的日期字符串");
        if (BizConstant.Common.WEEK.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_DAY.key()))
            return Result.error("日期格式不合法，请传入 yyyy-MM-dd 格式的日期字符串");
        if (BizConstant.Common.MONTH.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_MONTH.key()))
            return Result.error("日期格式不合法，请传入 yyyy-MM 格式的日期字符串");
        if (BizConstant.Common.YEAR.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_YEAR.key()))
            return Result.error("日期格式不合法，请传入 yyyy 格式的日期字符串");

        //生成分析报告数据  不携带JSON
        AlarmReport param = AlarmReport.builder().dateStr(dateStr).regionCode(regionCode).enterpriseNo(enterpriseNo).timeFlag(timeFlag).build();
        Map<String, Object> result = alarmReportService.generateReportJson(param);

        return Result.success(result);
    }

    /**
     * @return com.hd.common.reqres.response.Result<?>
     * @author chentl
     * @description 分析报告列表
     * @date 2021/3/2 1:54 下午
     * @params [requestData]
     */
    @PostMapping("/list")
    public Result<?> list(@RequestBody RequestData requestData) {
        Long current = requestData.getCurrent();
        Long size = requestData.getSize();
        String enterpriseNo = requestData.getString("enterpriseNo");
        String enterpriseName = requestData.getString("enterpriseName");
        String verifyStatus = requestData.getString("verifyStatus");
        String regionCode = requestData.getString("regionCode");
        String timeFlag = requestData.getString("timeFlag");

        AlarmReport param = new AlarmReport(timeFlag, regionCode, enterpriseNo, enterpriseName, verifyStatus);

        Page<Map<String, Object>> page = new Page<>();
        page.setCurrent(current);
        page.setSize(size);
        List<Map<String, Object>> result = (List<Map<String, Object>>) new AlarmReportWrapper(alarmReportService.pageList(page, param)).warp();
        page.setRecords(result);
        return Result.success(page);
    }

    /**
     * @return com.hd.common.reqres.response.Result<?>
     * @author chentl
     * @description 查询分析报告数据
     * @date 2021/3/2 9:55 上午
     * @params [requestData]
     */
    @PostMapping("/data")
    public Result<?> data(@RequestBody RequestData requestData) {
        String id = requestData.getString("id");

        if (StringUtils.isAnyEmpty(id)) return Result.error("参数中 id 均不允许为空");

        AlarmReport alarmReport = alarmReportService.getById(id);

        return Result.success(alarmReport);
    }

    /**
     * @return com.hd.common.reqres.response.Result<?>
     * @author chentl
     * @description 更新分析报告数据
     * @date 2021/3/2 9:53 上午
     * @params [requestData]
     */
    @PostMapping("/update")
    public Result<?> update(@RequestBody RequestData requestData) {
        String id = requestData.getString("id");
        String reportJson = requestData.getString("reportJson");

        if (StringUtils.isAnyEmpty(id, reportJson)) return Result.error("参数中 id、reportJson 均不允许为空");

        alarmReportService.updateReportData(id, reportJson);

        return Result.success(200, "分析报告数据已更新", id);

    }

    /**
     * @return com.hd.common.reqres.response.Result<?>
     * @author chentl
     * @description 重新生成分析报告
     * @date 2021/3/2 9:33 上午
     * @params [requestData]
     */
    @PostMapping("/reGenerate")
    public Result<?> regen(@RequestBody RequestData requestData) {
        String id = requestData.getString("id");

        AlarmReport alarmReportDb = alarmReportService.getById(id);
        //valid 1 存在校验
        if (alarmReportDb == null) return Result.error("该记录不存在或已被删除");
        //valid 2 已审核的不允许重新生成 (此判断废弃 2021年03月09日)
//        if (alarmReportDb.getVerifyStatus().equals(BizConstant.VerifyStatus.VERIFIED.key()))
//            return Result.error("分析报告已审核，不允许重新生成。");
        //valid 3 重新生成中的分析报告不允许再次重新生成
        if (alarmReportDb.getGenerateStatus().equals(BizConstant.GenerateStatus.RE_GENERATING.key()))
            return Result.error("分析报告正在重新生成，请耐心等待。");

        //更新分析报告为重新生成中状态
        alarmReportDb.setVerifyStatus(BizConstant.VerifyStatus.UN_VERIFIED.key());
        alarmReportDb.setGenerateStatus(BizConstant.GenerateStatus.RE_GENERATING.key());
        alarmReportDb.setUpdateBy(getCurrentUser().getUsername());
        alarmReportDb.updateById();


        //发送到分析报告生成队列
        rabbitProducer.sendToReportDataGenQueue(id);

        return Result.success(200, "操作成功，分析报告正在重新生成...", null);
    }

    /**
     * @return com.hd.common.reqres.response.Result<?>
     * @author chentl
     * @description 生成分析报告数据
     * @date 2021/3/1 4:55 下午
     * @params [requestData]
     */
    @PostMapping("/generateReport")
    public Result<?> generateReport(@RequestBody RequestData requestData) {
        String dateStr = requestData.getString("date");
        String regionCode = requestData.getString("regionCode");
        String enterpriseNo = requestData.getString("enterpriseNo");
        String timeFlag = requestData.getString("timeFlag");

        //valid 1 入参校验
        if (StringUtils.isAnyEmpty(dateStr)) return Result.error("请传入时间字段 dateStr");
        if (StringUtils.isAllEmpty(regionCode, enterpriseNo))
            return Result.error("参数中 regionCode 和 enterpriseNo 不允许同时为空");
        if (StringUtils.isBlank(timeFlag)) return Result.error("参数中 timeFlag 为空");

        if (BizConstant.Common.DAY.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_DAY.key()))
            return Result.error("日期格式不合法，请传入 yyyy-MM-dd 格式的日期字符串");
        if (BizConstant.Common.WEEK.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_DAY.key()))
            return Result.error("日期格式不合法，请传入 yyyy-MM-dd 格式的日期字符串");
        if (BizConstant.Common.MONTH.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_MONTH.key()))
            return Result.error("日期格式不合法，请传入 yyyy-MM 格式的日期字符串");
        if (BizConstant.Common.YEAR.key().equalsIgnoreCase(timeFlag) && !DateUtil.isValidDate(dateStr, BizConstant.Common.DATE_FORMAT_YEAR.key()))
            return Result.error("日期格式不合法，请传入 yyyy 格式的日期字符串");


        //valid 2 唯一校验
        int count = alarmReportService.count(new LambdaQueryWrapper<AlarmReport>().eq(AlarmReport::getEnterpriseNo, enterpriseNo).eq(AlarmReport::getRegionCode, regionCode).eq(AlarmReport::getDateStr, dateStr).eq(AlarmReport::getTimeFlag, timeFlag));
        if (count > 0) return Result.error(901, "分析报告记录已存在，是否立即重新生成?");


        //1 生成报告基础数据
        AlarmReport param = AlarmReport.builder().dateStr(dateStr).regionCode(regionCode).enterpriseNo(enterpriseNo).timeFlag(timeFlag).build();
        String id = alarmReportService.generateBaseReportData(param);

        //2 发送到分析报告生成队列
        rabbitProducer.sendToReportDataGenQueue(id);


        return Result.success(200, "操作成功，稍后生成分析报告...", null);
    }

}
